package BehavioralPattern.ChainOfResp;

/**
 * @Classname : ChainOfResp
 * @Description : 测试 责任链模式
 * 行为型——责任链模式
 * 一、模式定义
 *   Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.
 *   Chain the receiving objects and pass the request along the chain until an object handles it.
 *   使多个对象都有机会处理请求，从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有对象处理它为止。
 *   优点：
 *     将请求和处理解耦，请求者不知道是谁处理，处理者不知请求中全貌，可以提高系统灵活性
 *   缺点：
 *     性能问题，若责任链过长，从头遍历到尾比较耗时。
 *     若责任链过长，调试时逻辑比较复杂，系统复杂度增加。
 * 二、模式类图
 *    https://kdocs.cn/l/cnub8gC3cmG4
 * 三、适用场景
 *   1、当随请求不同存在不同的响应时（请求中变化的属性一般是数值的变化，分布不同区间得到不同响应）
 * 四、应用举例
 *   1、审批流程
 * @Author : chentianyu
 * @Date 2023/3/5 11:38
 */


public class ChainOfRespClient {
    public static void main(String[] args) {
        // 创建责任人
        Handler groupLeader = new GroupLeader("薛慕华");
        Handler centreLeader = new CentreLeader("苏星河");
        Handler deptLeader = new DeptLeader("无崖子");
        // 建立责任链
        groupLeader.setNext(centreLeader);
        centreLeader.setNext(deptLeader);

        System.out.println("---------请假条---------");
        Request ZhangSan = new ConcreteRequest("张三", 2);
        ZhangSan.request(groupLeader);

        System.out.println("---------请假条---------");
        Request LiSi = new ConcreteRequest("李四", 6);
        LiSi.request(groupLeader);

        System.out.println("---------请假条---------");
        Request WangWu = new ConcreteRequest("王五", 10);
        WangWu.request(groupLeader);

        System.out.println("---------请假条---------");
        Request QianLiu = new ConcreteRequest("钱六", 50);
        QianLiu.request(groupLeader);
    }
}

/** 20230305
 * ---------请假条---------
 * 张三因家中有事发起请假请求
 * 请假天数【2】属于区间 (0, 3] ，小组负责人【薛慕华】审批通过
 * ---------请假条---------
 * 李四因家中有事发起请假请求
 * 请假天数【6】属于区间 (3, 7] ，中心负责人【苏星河】审批通过
 * ---------请假条---------
 * 王五因家中有事发起请假请求
 * 请假天数【10】属于区间 (7, 30] ，部门负责人【无崖子】审批通过
 * ---------请假条---------
 * 钱六因家中有事发起请假请求
 * 请假天数【50】没地方请示，按不同意处理
 */
